﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
using System.ServiceModel;
using System.Text;
using AgenciaViajeServices.Persistencia;
using AgenciaViajeServices.Dominio;

namespace AgenciaViajeServices
{
    public class Rendirs : IRendirs
    {
        private RendirDAO rendirDAO = null;
        private RendirDAO RendirDAO
        {
            get
            {
                if (rendirDAO == null)
                    rendirDAO = new RendirDAO();
                return rendirDAO;
            }
        }

        private AutorizacionDAO autorizacionDAO = null;
        private AutorizacionDAO AutorizacionDAO
        {
            get
            {
                if (autorizacionDAO == null)
                    autorizacionDAO = new AutorizacionDAO();
                return autorizacionDAO;
            }
        }

        public Rendir ObtenerRendir(int codigo)
        {
            return RendirDAO.Obtener(codigo);
        }

        public Rendir CrearRendir(int codau, int codemp, string estasol, double hotel, double viaticos, double movi, double tele, double gasto, double impaereo, double pasaje, double combus, double otros)
        {
            Autorizacion auto = new Autorizacion();
            auto = AutorizacionDAO.Obtener(codau);

            if (auto == null)
            {
                throw new FaultException<ValidationException>(new ValidationException { ValidationError = "Autorizacion no Existe" }, new FaultReason("Autorizacion no Existe"));
            }
            else
            {
                if (auto.Status == "PENDIENTE")
                {
                    throw new FaultException<ValidationException>(new ValidationException() { ValidationError = "Autorizacion Pendiente" }, new FaultReason("Autorizacion Pendiente"));
                }
                else if (auto.Status == "DENEGADO")
                {
                    throw new FaultException<ValidationException>(new ValidationException() { ValidationError = "Autorizacion Denegado" }, new FaultReason("Autorizacion Denegado"));
                }

            }

            double number2 = 0.0;
            bool canConvert1 = double.TryParse(hotel.ToString(), out number2);
            bool canConvert2 = double.TryParse(viaticos.ToString(), out number2);
            bool canConvert3 = double.TryParse(movi.ToString(), out number2);
            bool canConvert4 = double.TryParse(tele.ToString(), out number2);
            bool canConvert5 = double.TryParse(gasto.ToString(), out number2);
            bool canConvert6 = double.TryParse(impaereo.ToString(), out number2);
            bool canConvert7 = double.TryParse(pasaje.ToString(), out number2);
            bool canConvert8 = double.TryParse(combus.ToString(), out number2);
            bool canConvert9 = double.TryParse(otros.ToString(), out number2);

            if (canConvert1 != true || canConvert2 != true || canConvert3 != true || canConvert4 != true || canConvert5 != true || canConvert6 != true || canConvert7 != true || canConvert8 != true || canConvert9 != true)
            {
                throw new FaultException<ValidationException>(new ValidationException { ValidationError = "Debe ingresar un monto Correcto" }, new FaultReason("Debe ingresar un monto Correcto"));
            }

            Rendir rendirACrear = new Rendir()
            {

                CodAU = codau,
                CodEMP = codemp,
                ESTADOSOL = estasol,
                Hotel = hotel,
                Viaticos = viaticos,
                Movilidad = movi,
                Telefono = tele,
                Gastos = gasto,
                IMPAereo = impaereo,
                Pasaje = pasaje,
                Combustible = combus,
                Otros = otros
            };

            return RendirDAO.Crear(rendirACrear);
        }

        public Rendir ModificarRendir(int codigo, int codau, int codemp, string estasol, double hotel, double viaticos, double movi, double tele, double gasto, double impaereo, double pasaje, double combus, double otros)
        {
            Rendir rendirAModificar = new Rendir()
            {
                CodigoRE = codigo,
                CodAU = codau,
                CodEMP = codemp,
                ESTADOSOL = estasol,
                Hotel = hotel,
                Viaticos = viaticos,
                Movilidad = movi,
                Telefono = tele,
                Gastos = gasto,
                IMPAereo = impaereo,
                Pasaje = pasaje,
                Combustible = combus,
                Otros = otros
            };
            return RendirDAO.Modificar(rendirAModificar);
        }

        public void EliminarRendir(int codigo)
        {
            Rendir rendirExistente = RendirDAO.Obtener(codigo);
            RendirDAO.Eliminar(rendirExistente);
        }

        public List<Rendir> ListarRendir()
        {
            return RendirDAO.ListarTodos().ToList();
        }
    }
}
